/***************************************************************************
 * This program is free software; you can redistribute it and/or           *
 * modify it under the terms of the GNU General Public License             *
 * as published by the Free Software Foundation; either version 2          *
 * of the License, or (at your option) any later version.                  *
 *                                                                         *
 * This program is distributed in the hope that it will be useful,         *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
 * GNU General Public License for more details.                            *
 *                                                                         *
 * You should have received a copy of the GNU General Public License       *
 * along with this program; if not, write to the Free Software Foundation, *
 * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.         *
 *                                                                         *
 *   Copyright (C) 2007,2008 by Ivan Vucica                                *
 *   ivucica@gmail.com                                                     *
 ***************************************************************************/


#ifndef __PROCEDURE_H
#define __PROCEDURE_H

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <string>
#include <map>
#include <vector>

#define PROCPARAMS const std::vector<class Token>&t, class LogoContext &global, class LogoContext &local

typedef class Token (*prim_t)(PROCPARAMS);

struct procedure_t {
	procedure_t () {
		primitive = false;
		proctext = NULL; // automatically sets prim to null, too.
		argc = 0;
	}
	~procedure_t () {
		if (!primitive)
			if (proctext)
				free(proctext);
	}
	union {
		prim_t prim;
		char *proctext;
	};
	std::vector <std::string> procparams;
	int argc;
	bool primitive;
	std::string name;
};




//extern std::map<std::string, procedure_t*> procedures;


#endif
